package main

import (
	"fmt"
	"math"
	"sort"
	"time"
)

// 1、实现对圆形、三角形、长方形求面积
type calculaer interface {
	area() float64
}

// 圆形 S=πr²
type circular struct {
	r float64
}

func (c *circular) area() float64 {
	return math.Pi * c.r * c.r
}

// 三角形 S=1/2ah
type triangle struct {
	a float64
	h float64
}

func (t *triangle) area() float64 {
	return t.a * t.h / 2
}

// 长方形 S=ab
type rectangle struct {
	a float64
	h float64
}

func (r *rectangle) area() float64 {
	return r.a * r.h
}

func one(c calculaer) float64 {
	return c.area()
}

// 2、利用第1题，构造3个以上图形，至少圆形、三角形、矩形各有一个，对上题的图形按照面积降序排列
func two() {
	c := math.Round(one(&circular{5}))
	t := math.Round(one(&triangle{5, 5}))
	t2 := math.Round(one(&triangle{10, 10}))
	r := math.Round(one(&rectangle{5, 5}))
	a := []float64{c, t, r, t2}
	//sort.Sort(sort.Reverse(sort.Float64Slice(a)))
	sort.Slice(a, func(i, j int) bool {
		return a[i] > a[j]
	})
	fmt.Println(a)
}

// 3、分析斐波那契数列递推公式递归版本的问题，试着为该函数提供一个Cache，使其计算效率提升
var cache = make(map[int]int)

func three(n int) int {
	if n <= 2 {
		return 1
	} else {
		if v, ok := cache[n]; ok {
			return v
		} else {
			cache[n] = three(n-1) + three(n-2)
			return cache[n]
		}
	}
}

// 4、8年前的今天上午9点30分
// 要求：
// 1. 毫秒时间戳是多少？
// 2. 格式化输出时间为 2005/09/10 21:35:40 +0800 的形式
// 3. 请问那天是周几？到那天，本年已经过了多少周？
// 4. 距离今天已经过了多少天了？
func four() {
	now := time.Now().Local()
	fmt.Println("本地当前时间：", now)
	t := time.Date(now.AddDate(-8, 0, 0).Year(), now.AddDate(-8, 0, 0).Month(), now.AddDate(-8, 0, 0).Day(), 9, 30, 0, 0, time.Local)
	fmt.Println("8年前的今天上午9点30分：", t)
	fmt.Println("毫秒时间戳：", t.UnixMilli())
	fmt.Println("格式化输出：", t.Format("2006/01/02 15:04:05 -0700"))
	_, w := t.ISOWeek()
	fmt.Println("那天是周", int(t.Weekday()), "，到那天，本年已经过了", w, "周")
	fmt.Println("距离今天已经过了", int(now.Sub(t).Seconds()/60/60/24), "天了")
}

func main() {
	two()
	fmt.Println(three(10))
	four()
}
